package cn.huaguo.domain.task.repository;

import cn.huaguo.domain.order.model.entity.OrderEntity;
import cn.huaguo.domain.task.model.aggragate.PublishTradeTaskAggregate;
import cn.huaguo.domain.task.model.entity.PublishTaskEntity;
import cn.huaguo.domain.task.model.entity.TaskEntity;
import cn.huaguo.domain.task.model.valobj.TaskPageQueryVO;
import cn.huaguo.domain.wallet.model.entity.WalletEntity;
import cn.huaguo.types.model.PageResult;

/**
 * @Description 任务仓储接口
 * @Author wangQian
 * @Date 2024/5/13
 */
public interface ITaskRepository {
    /**
     * 新增任务
     *
     * @param publishTradeTaskAggregate
     */
    PublishTaskEntity newTradeTask(PublishTradeTaskAggregate publishTradeTaskAggregate);

    /**
     * 条件查询
     *
     * @return
     */
    PageResult<TaskEntity> queryTaskList(TaskPageQueryVO taskPageQueryVO, String createUserId);


    /**
     * 根据id查询任务
     *
     * @param taskId
     * @return
     */
    TaskEntity getTaskById(String taskId);

    /**
     * 更新任务 包含更新状态
     *
     * @param taskEntity
     * @return
     */
    Boolean updateTask(TaskEntity taskEntity);

    /**
     * 根据id删除任务
     *
     * @param taskId
     * @return
     */
    void deleteTaskById(String taskId);

    /**
     * 库存扣减
     *
     * @param taskId
     * @return
     */
    Boolean subtractStock(String taskId);

    /**
     * 发送消息队列
     *
     * @param taskId
     */
    void sendConsumerQueue(String taskId);

    /**
     * 获取队列值
     *
     * @return
     */
    String takeQueueValue();

    /**
     * 更新任务库存
     *
     * @param taskId
     */
    void updateTaskStock(String taskId);

    /**
     * 支付成功后回调 更新任务及订单状态
     *
     * @param publishTaskEntity
     */
    void updateTaskOrderStatus(PublishTaskEntity publishTaskEntity);

    /**
     * 发布无交易类型任务
     *
     * @param taskEntity
     */
    void publishNoTradeTask(TaskEntity taskEntity);

    /**
     * 确认任务完成
     *
     * @param taskId
     * @param orderEntity
     * @param walletEntity
     */
    void confirmFinishTask(String taskId, OrderEntity orderEntity, WalletEntity walletEntity);

    /**
     * 取消任务
     *
     * @param taskEntity
     * @param orderEntity
     */
    void cancelTask(TaskEntity taskEntity, OrderEntity orderEntity);
}
